﻿// liblog.h
#ifndef _LIB_LOG_H_
#define _LIB_LOG_H_

#include <stdarg.h>

#ifndef LIBLOG_API
	#ifdef WIN32
		#ifdef LIBLOG_EXPORTS
			#define LIBLOG_API __declspec(dllexport)
		#else
			#define LIBLOG_API __declspec(dllimport)
			#pragma comment(lib,"liblog")
		#endif
	#else
		#define LIBLOG_API
	#endif
#endif

#define LOGTYPE_SIZE		0x00000004

//日志级别
#define INFO_LOG			0x00000000						//信息日志
#define WARN_LOG			0x00000001						//警告日志
#define ERROR_LOG			0x00000002						//错误日志
#define DEBUG_LOG			0x00000003						//调试日志


//打印日志级别开关
#define PRINT_ALL			0xffffffff						//打印所有日志
#define PRINT_NONE			0x00000000						//无任何日志打印
#define PRINT_INFO			(0x00000001<<INFO_LOG)			//打印信息
#define PRINT_WARN			(0x00000001<<WARN_LOG)			//打印警告
#define PRINT_ERROR			(0x00000001<<ERROR_LOG)			//打印错误
#define PRINT_DEBUG			(0x00000001<<DEBUG_LOG)			//打印调试

#ifdef  __cplusplus
extern "C"
{
#endif

typedef void (*LibLogCallback)(int logLevel, const char* prefix, const char* log, unsigned int logLen,void* param);

// 设置日志回调
// 每条日志回调一次
// fCallback为空,取消日志回调
LIBLOG_API void LibLog_SetLogCallback(LibLogCallback fCallback,void* param);

// 设置日志的目录，默认使用当前程序目录
LIBLOG_API bool LibLog_SetDir(const char* dir);
LIBLOG_API const char* LibLog_GetDir(); 

//设置每n条日志fflush一次到文件，默认50条
LIBLOG_API void LibLog_SetFlushLines(unsigned int nLines);
LIBLOG_API unsigned int LibLog_GetFlushLines();
//立即写入文件
LIBLOG_API void LibLog_FlushFile();

// 设置每n个小时更换日志文件，默认1小时
LIBLOG_API void LibLog_SetFileTimeInterval(unsigned int nHours);
LIBLOG_API unsigned int LibLog_GetFileTimeInterval();

// 是否打印到屏幕，默认true
LIBLOG_API void LibLog_IsPrintScreen(bool bScreen);
LIBLOG_API bool LibLog_GetPrintScreen();

// 设置日志文件保存的有效期，默认7天
LIBLOG_API void LibLog_SetLogExpireTime(unsigned int nDays);
LIBLOG_API unsigned int LibLog_GetLogExpireTime();

//设置日志打印级别开关,默认 PRINT_ALL 
LIBLOG_API void LibLog_SetPrintLevel(int printLevel);
LIBLOG_API int LibLog_GetPrintLevel();

//记录日志
LIBLOG_API void LibLog_Print(int LogLevel, const char* format, ...);
LIBLOG_API void LibLog_PrintEx(int LogLevel,const char* format,va_list argList);

//按自定义文件名前缀记录日志
LIBLOG_API void LibLog_PrintLog(const char* prefix,int LogLevel,const char* format, ...);
LIBLOG_API void LibLog_PrintLogEx(const char* prefix,int LogLevel,const char* format,va_list argList);

#ifdef  __cplusplus
}
#endif

#define IMPL_LOGLevel(level)									\
inline void LOGLevel##level(const char* format, ...)			\
{																\
		va_list argList;										\
		va_start(argList, format);								\
		::LibLog_PrintEx(level, format, argList);				\
		va_end(argList);										\
}

IMPL_LOGLevel(INFO_LOG)
IMPL_LOGLevel(WARN_LOG)
IMPL_LOGLevel(ERROR_LOG)
IMPL_LOGLevel(DEBUG_LOG)


#define LOGLevel(level, _x_)	LOGLevel##level _x_;
#define LogInfo(_x_)			LOGLevel(INFO_LOG,_x_)
#define LogWarn(_x_)			LOGLevel(WARN_LOG,_x_)
#define LogError(_x_)			LOGLevel(ERROR_LOG,_x_)
#define LogDebug(_x_)			LOGLevel(DEBUG_LOG,_x_)

#define IMPL_LOGLevelEx(level)									\
inline void LOGLevelEx##level(const char* prefix,const char* format, ...)			\
{																\
	va_list argList;										\
	va_start(argList, format);								\
	::LibLog_PrintLogEx(prefix,level, format, argList);					\
	va_end(argList);										\
}

IMPL_LOGLevelEx(INFO_LOG)
IMPL_LOGLevelEx(WARN_LOG)
IMPL_LOGLevelEx(ERROR_LOG)
IMPL_LOGLevelEx(DEBUG_LOG)

#define LOGLevelEx(level, _x_)	LOGLevelEx##level _x_;
#define LogInfoEx(_x_)			LOGLevelEx(INFO_LOG,_x_)
#define LogWarnEx(_x_)			LOGLevelEx(WARN_LOG,_x_)
#define LogErrorEx(_x_)			LOGLevelEx(ERROR_LOG,_x_)
#define LogDebugEx(_x_)			LOGLevelEx(DEBUG_LOG,_x_)

#endif
